home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / LIBRARY / CFI_V607 / CFIDOCEN.DOC < prev    next >
Text File  |  1993-01-04  |  34KB  |  711 lines

  1. ╔══════════════════════════════
  2. ║ TxCFI     Compressed Files               ┌─────────────────┐
  3. ║           Interface                      │     Member      │────┐
  4. ╟──────────────────────────────            │       of        │░░░░│
  5. ║ (c) 1989 Robert W. van Hoeven            │                 │░░░░│
  6. ╟──────────────────────────────            │ Badhoevedorpse  │░░░░│
  7. ║ Release : 6.07                           │     Pascal      │░░░░│
  8. ║ Rel.Date: 10th August 1989               │  Programmeurs   │░░░░│
  9. ╠══════════════════════════════            │   Collectief    │░░░░│
  10. ║                                          └─────────────────┘░░░░│
  11. ║ │ T4CFI.TPU                                   │░░░░░░░░░░░░░░░░░│
  12. ║ │ T5CFI.TPU                                   └─────────────────┘
  13. ║ │ T55CFI.TPU                                     ┌─────┐
  14. ║ │ CFITEST.PAS                                    │░░░░░│
  15. ║ │  Changes marked with                           └──┬──┘
  16. ║ │  '|' at the start of                         ┌────┴────┐
  17. ║ │  the line !!!!!!!!!!          ┌ ─ ─ ─ ─ ─ ─ ─││││││ ═══│─ ─ ─ ─ ─ ─ ─ ┐
  18. ║                                                └─────────┘
  19. ╠═══════════════════════════════  │     ┌─────┐   │   B   │   ┌─────┐     │
  20. ║ Address: Robert W. van Hoeven         │░░░░░│   │ P + P │   │░░░░░│
  21. ║          PO Box 131             │     └──┬──┘   │   C   │   └──┬──┘     │
  22. ║          1170 AC Badhoevedorp       ┌────┴────┐ └───────┘ ┌────┴────┐
  23. ║          Nederland (NL)         └ ─ ││││││ ═══│─ ─ ─ ─ ─ ─││││││ ═══│ ─ ┘
  24. ╚═══════════════════════════════      └─────────┘           └─────────┘
  25.  
  26. ************************************************************************
  27. * WARNING: The interface record has been changed. Total length is now  *
  28. *          8 bytes longer (than CFI 5.xx and lower)                    *
  29. * WARNING: The PKZIP V 1.00 implementation is taken from the documents *
  30. *          in the beta version. If they change before PKZIP V 1.00 is  *
  31. *          released, a new version of CFI will also be released !!!!!  *
  32. ************************************************************************
  33.  
  34.  Copyrights
  35.  ───────────────────────────────────────────────────────────────
  36.  - The package is donated to Public Domain, excluding the source-
  37.    code for the units;
  38.  - THE AUTHOR OF THE PROGRAM SHALL NOT IN ANY CASE BE LIABLE FOR
  39.    SPECIAL, INCIDENTAL, CONSEQUENTIAL, INDIRECT OR OTHER SIMILAR
  40.    DAMAGES ARISING FROM USING THIS PROGRAM OR ITS FUNCTIONS.
  41.  - You may not make any changes or modifications to the program;
  42.  - You may make as many copies of the program and its extra files
  43.    as you like and distribute them to friends, but you have to supply
  44.    the package in its original form;
  45.  - When you should use the package, I should like it, when you send
  46.    me a postcard or a Netmail <tm> message. Only when getting enough
  47.    reactions, I will continue to support this package;   .
  48.  - You may use the TxCFI.TPU file(s) in your own programs. When you
  49.    want to offer these program's to others, this can only be done in
  50.    the form of Public Domain programs and you have to include a
  51.    reference to the original CFI-package in your documentation;
  52.  - System Enhanced Assosiates (SEA) regard ARC as their trademark, but
  53.    SEA has indicated that Public Domain programs may process .ARC files
  54.    without notice;
  55.  
  56.  Introduction to TxCFI.TPU
  57.  ───────────────────────────────────────────────────────────────
  58.  The supplied UNIT's in this package are usefull when you want
  59.  to work with compressed files. I have supplied the following
  60.  interfaces:
  61.  
  62.  - PKWare's          ZIP-files (and old ARC versions)
  63.  - NoGate's          PAK-files
  64.  - Sea's             ARC-files
  65.  - R. Dhesi's        ZOO-files
  66.  - H. Yoshi's        LHZ-files or ICE-files
  67.  - M. Miki's         LZS-files (also H. Okumura and K. Masuyama)
  68.  - Dean W. Cooper's  DWC-files
  69.  
  70.  The supplied UNIT uses the same routines, transparent from the fact
  71.  what type of compressed file you want to read, only the type of in-
  72.  formation you get back in your interface record is more or less de-
  73.  pendent on the type of compressed files.
  74.  
  75.  Description of TxCFI.TPU
  76.  ───────────────────────────────────────────────────────────────
  77.  This UNIT carries 6 functions, 1 procedure, 1 interface TYPE and
  78.  some variables. The latter you normaly don't use, exept when the
  79.  supplied compression-files don't confirm to the standard naming
  80.  conventions in the extension of the filename.
  81.  
  82.  The interface between YOUR program and this UNIT lies in a pre-
  83.  defined record-type with the name 'CIRTyp' (CIR meens Compression
  84.  Interface Record).
  85.  
  86.  The declaration of this TYPE is:
  87.  
  88.  CIRTyp=RECORD
  89.     CIRAtr:BYTE;
  90.            {Contains the attribute of the current    }
  91.            {compression method.                      }
  92.            {SEA         1 = stored                   }
  93.            {            2 = stored                   }
  94.            {            3 = packed                   }
  95.            {            4 = Squeezed                 }
  96.            {            5 = Crunched                 }
  97.            {            6 = Crunched                 }
  98.            {            7 = Crunched                 }
  99.            {            8 = Crunched                 }
  100.            {PKWARE      9 = Squashed  (only PkWare)  }
  101.            {PAK        10 = Crushed   (only NoGate)  }
  102.            {           11 = Distilled (only NoGate)  }
  103.            {           45 = PAK archive comment      }
  104.            {           46 = PAK file    comment      }
  105.            {           47 = Path for file            }
  106.            {           48 = Security enveloppe       }
  107.            {           49 = Error Correction         }
  108.            {                                         }
  109.            {ZIP Local  50 = stored                   }
  110.            {           51 = Shrunk                   }
  111.            {           52 = Reduced factor 1         }
  112.            {           53 = Reduced factor 2         }
  113.            {           54 = Reduced factor 3         }
  114.            {           55 = Reduced factor 4         }
  115.            {           56 = Imploding                }
  116.            {ZIP C_Dir  80 = stored                   }
  117.            {           81 = Shrunk                   }
  118.            {           82 = Reduced factor 1         }
  119.            {           83 = Reduced factor 2         }
  120.            {           84 = Reduced factor 3         }
  121.            {           85 = Reduced factor 4         }
  122.            {           86 = Imploding                }
  123.            {ZIP E_ZIP  99 = End of Central ZIP-Dir   }
  124.            {                                         }
  125.            {ZOO       100 = Stored                   }
  126.            {          101 = LWZ compression          }
  127.            {          150 = Stored (deleted)         }
  128.            {          151 = LWZ compression (deleted)}
  129.            {                                         }
  130.            {LZH/ICE   200 = Stored                   }
  131.            {          201 = LZHufman compression     }
  132.            {LZH/LZS   202 = LZS (LZH) -lz4-          }
  133.            {          203 = LSZ (LZH) -lz5-          }
  134.            {LZS       230 = LZS -lz0- (??)*          }
  135.            {          231 = LZS -lz1- (??)*          }
  136.            {          232 = LZS -lz2- (??)*          }
  137.            {          233 = LZS -lz3- (??)*          }
  138.            {          249 = LZS -lz?- (??)*          }
  139.            {                                         }
  140.            {DWC       250 = Stored                   }
  141.            {          251 = Crunched                 }
  142.     CIRNam:STRING[12];
  143.            {Contains the filename (empty with types  }
  144.            {45,46,99)                                }
  145.     CIRPth:STRING[80];
  146.            {Contains the (relative) path with ZIP and}
  147.            {ZOO and LZH/ICE, otherwise empty          }
  148.     CIRExt:STRING;
  149.            {Contains empty string and is present for }
  150.            {future releases of PKZIP                 }
  151.     CIRDes:STRING;
  152.            {Contains empty string or the archive     }
  153.            {description (types 45,46,99 and all ZOO) }
  154.     CIROSi:LONGINT;
  155.            {Original size of compressed file         }
  156.     CIRASi:LONGINT;
  157.            {Compressed size of file                  }
  158.     CIRDTm:LONGINT;
  159.            {Contains creation date/time as a LONGINT }
  160.            {as found in a Pascal SearchRec           }
  161.     CIRCRC:LONGINT;
  162.            {Contains CRC depending on compression or }
  163.            {the filenumber for a comment records in  }
  164.            {PAK files. For PAK (attr 46)             }
  165.            {0  : The comment for the whole PAK file  }
  166.            {nn : The comment for the nn'th file in   }
  167.            {     the PAK                             }
  168.            {The same goes for type 47. CRC contains  }
  169.            {the filenumber the path belongs to       }
  170.     CIRFAt:BYTE;
  171.            {Contains 0 or the fileatrribute of the   }
  172.            {original file (only ZIP and LZH/ICE)     }
  173.     CIRSPo:LONGINT;
  174.            {Absolute start (zero based) of the this  }
  175.            {header in the compressed file            }
  176.     CIRLen:LONGINT;
  177.            {Length (header included) of this file in }
  178.            {the compressed file                      }
  179.     CIRFl1:WORD;
  180.            {Optional bit-mapped flag. Only used for  }
  181.            {ZIP-files this moment. When ZIP, this    }
  182.            {bitmap contains the INTERNAL attribute ! }
  183.            {This bitmap is only available in central }
  184.            {directory entries.                       }
  185.     CIRFl2:WORD;
  186.            {Optional bit-mapped flag. Only used for  }
  187.            {ZIP-files this moment. When ZIP, this    }
  188.            {bitmap contains the general purpose flag }
  189.  END;
  190.  
  191.  WARNING: When you process a file with the extension PAK, ARC
  192.           or PKA, the NEXT_CFL function can return a mixture
  193.           of types in the CIRAtr variable. When testing this
  194.           variable, please test every possible entry other-
  195.           wise your program will do 'strange' things. When
  196.           using this variable, you can best use a CASE with
  197.           an ELSE clause (look in the demo for an example) !
  198.  
  199.  (*) NOTE:Current DOC's for LARC (V 3.33) are not available to
  200.           me. The headers are the same as Yoshi's LHarc program,
  201.           but only the values -lz4- and -lz5- (which you can al-
  202.           so process with LHARC.EXE) are known. The -lz0- to -lz3-
  203.           are only guesses.
  204.  
  205.  The following CONST's are carried out to you:
  206.  
  207.       HeapAl:BOOLEAN:FALSE;
  208.              {Toggle for external HEAP functions         }
  209.       CFlSFX:BOOLEAN:FALSE;
  210.              {Toggle for SFX testing in TEST_CFL function}
  211.       CFlVer:STRING[10];
  212.              {The current version of TxCFl             }
  213.       CFlCpy:STRING[80];
  214.              {The complete copyrights for the current  }
  215.              {version                                  }
  216.       DayMon:ARRAY[1..12] OF BYTE;
  217.              {A table with number of days iper month   }
  218.  
  219.  
  220.  The following VAR's are carried out to you:
  221.  
  222.       CFlFil:FILE;
  223.              {The FILE variable for the current file   }
  224.              {NEVER do something with this variable !! }
  225.  
  226.       CFlTyp:BYTE;
  227.              {The type of compression TxCFI has de-    }
  228.              {tected (depending on the file extension) }
  229.              {0 = Invalid                              }
  230.              {1 = ARC/PAK/PKA                          }
  231.              {2 = ZIP                                  }
  232.              {3 = ZOO                                  }
  233.              {4 = LZH/ICE                              }
  234.              {5 = DWC                                  }
  235.              {NEVER (and I mean NEVER) change this     }
  236.              {variable (CFI will return invalid entries}
  237.              {or aborts ! Only use this variable as a  }
  238.              {reference.                               }
  239.  
  240.       CFlPos:LONGINT;
  241.              {The current position in the open file    }
  242.              {NEVER, and I meen NEVER change this vari-}
  243.              {able in your program, strange things may }
  244.              {occur and TcCFI will (at least) not re-  }
  245.              {turn valid entries to you                }
  246.  
  247.       ZIPALL:BOOLEAN;
  248.              {TRUE when all ZIP-types are wanted, FALSE}
  249.              {when only local-types are wanted (faster)}
  250.              {TxCFI will set this variable to TRUE by  }
  251.              {default, before the call to Next_CFL you }
  252.              {can change the variable to FALSE.        }
  253.  
  254.       DWCNuE:INTEGER;
  255.              {This variable contains the total number  }
  256.              {of entries in a DWC-file, AFTER the first}
  257.              {NEXT_CFL call. You can inspect this      }
  258.              {variable, but you must NEVER change it ! }
  259.  
  260.       DWCCuE:INTEGER;
  261.              {This variable contains the current entry }
  262.              {number in the DWC-file, AFTER every      }
  263.              {NEXT_CFL call. You can inspect this      }
  264.              {variable, but you must NEVER change it ! }
  265.  
  266.       CFlOSi:LONGINT;
  267.              {This variable contains the total of the  }
  268.              {original file-sizes in the compressed    }
  269.              {file until now. You can inspect this     }
  270.              {variable after every call to NEXT_CFl and}
  271.              {even after CLOS_CFL !                    }
  272.  
  273.       CFlASi:LONGINT;
  274.              {This variable contains the total of the  }
  275.              {compressed file-sizes in the compressed  }
  276.              {file until now. You can inspect this     }
  277.              {variable after every call to NEXT_CFl and}
  278.              {even after CLOS_CFL !                    }
  279.              {The number given is the REAL total of all}
  280.              {compressed files in this compression file}
  281.              {until now. It DOES NOT include headers   }
  282.              {and other overhead bytes !               }
  283.  
  284.       DaySav:BOOLEAN;
  285.       GMTDif:LONGINT;
  286.              {DWC make's usage of the C-library Time-  }
  287.              {Zone variable (TZ= in the environment    }
  288.              {block). CFI searches the environment and }
  289.              {places the difference between GMT and the}
  290.              {found TimeZone as seconds in GMTDif. When}
  291.              {a daylight saving component is found in  }
  292.              {TZ, DaySav is set to TRUE (hence subtrac-}
  293.              {ting an hour). You can set DaySav to the }
  294.              {FALSE value yourself.                    }
  295.  
  296.  
  297.  TxCFI contains the following FUNCTION's and PROCEDURE's:
  298.  
  299.  =======================================================================
  300.  FUNCTION  Open_CFl(CFlNam:STRING):BOOLEAN;
  301.  
  302.  Result     : BOOLEAN
  303.  
  304.  Input      : The name of the compressed file and optional the drive
  305.               and path;
  306.  
  307.  Description: Call this function to open the file, supplied in 'CFLNAM'
  308.               and let TxCFI work out the type of compression file de-
  309.               pending on the extension.
  310.               If the file does not exist, or has an invalid extension,
  311.               the function will return FALSE, otherwise the function
  312.               will return TRUE.
  313.  
  314.  Remarks    : OPEN_CFl sets the variables CflPos, CflFil and CflTyp.
  315.               OPEN_Cfl will also (re)set the working variables for
  316.               DWC-timedate stamps when opening a DWC-file. It will
  317.               look at the current values of GMTDif and DaySav and
  318.               create a difference out of these variables.
  319.               Never use this function for the second time if you have
  320.               not used Clos_CFL.
  321.  
  322.  Remarks    : See Test_CFL and Forc_CFL functions.
  323.  
  324.  =======================================================================
  325.  FUNCTION  Test_CFl(CFlNam:STRING):BYTE;
  326.  
  327.  Result     : BOOLEAN
  328.  
  329.  Input      : The name of the compressed file and optional the drive
  330.               and path;
  331.  
  332.  Description: Call this function to open a file, supplied in 'CFLNAM'
  333.               and let TxCFI work out the type of compression file de-
  334.               pending on the INTERNAL file structure.
  335.               If the file does not exist, or has an invalid internal
  336.               format, the function will return 0, otherwise the func-
  337.               tion will return 1 (ARC), 2 (ZIP), 3 (ZOO), 4 (LZH) or
  338.               5 (DWC).
  339.               If there is not enough memory for HEAP functions (this
  340.               must be at least 20000 bytes), Test_CFL returns with
  341.               a value 255.
  342.               If the file is of type .COM or .EXE and CFlSFX is set
  343.               to FALSE (default) then these files are skipped. If the
  344.               boolean is set to TRUE before you call Test_CFl, this
  345.               function will test .COM and .EXE files for SFX-headers.
  346.               If the file is a SFX-file (Self Extracting Archive),
  347.               Test_CFL sets the starting location in the SFX-file
  348.               in the variable CFlPos, otherwise CFlPos is set to 0.
  349.  
  350.  Remarks    : Test_CFl opens the supplied file and reads the first
  351.               29 bytes. Depending on compression headers, the function
  352.               determines what kind of file it is working on. If the
  353.               file isn't a compressed file a 0 is returned, otherwise
  354.               the function returns a valid CFLTyp value (1,2,3,4,5).
  355.               When the file has an extension of .EXE or .COM, Test_CFL
  356.               will read the first 20000 bytes of the file to see if it
  357.               is a SFX-file. When this is the case, Test_CFl will re-
  358.               turn the correct CFLTyp value (only 1,2 and 5).
  359.               Test_CFl sets the global variable CFlPos to a value. You
  360.               can read the value but you are advised not to change the
  361.               value. The following function call to Next_CFl will use
  362.               this value to determine the starting position inside
  363.               the file.
  364.               The 29 (or 20000) bytes are stored on the HEAP. Cfl
  365.               releases this bytes from the HEAP before terminating
  366.               the function (see chapter on HEAP-mamagement). After
  367.               the test all files are closed !
  368.               Test_Cfl does not open a DWC file. It only returns 5
  369.               as a result of the test. The test is done on extension.
  370.  
  371.  Remarks    : See Forc_CFL
  372.  
  373.  =======================================================================
  374.  FUNCTION  Forc_CFl(CFlNam:STRING,CflAtt:BYTE):BOOLEAN;
  375.  
  376.  Result     : BOOLEAN
  377.  
  378.  Input      : The name of the compressed file (optional drive and
  379.               path) and a valid CFlTyp (1, 2, 3, 4 or 5) or a SFX
  380.               file (.COM or .EXE tested with Test_CFl) and a valid
  381.               CFlTyp (1,2 or 5).
  382.  
  383.  Description: Call this function to open the file, supplied in 'CFLNAM'.
  384.               TxCFI sets all global variables AND sets the CFlTyp to
  385.               the value supplied in CFlAtt. Never use other values than
  386.               1 (ARC/PAK/PKPAK), 2 (ZIP), 3 (ZOO), 4 (LZH) or 5 (DWC)
  387.               for CflAtt. In case of doubt, let Test_CFL work out the
  388.               internal structure of the file and use the returned value
  389.               as input for CflAtt. This is also the case when working
  390.               on SFX files, because CFL needs to know the starting point
  391.               inside the SFX-file.
  392.               FORC_Cfl will also (re)set the working variables for
  393.               DWC-timedate stamps when opening a DWC-file. It will
  394.               look at the current values of GMTDif and DaySav and
  395.               create a difference out of these variables.
  396.  
  397.  Remarks    : Forc_CFl sets the variables CflFil and CflTyp. It uses
  398.               the variable CFlPos.
  399.               Never use this function for the second time if you have
  400.               not used Clos_CFL.
  401.  
  402.  Remarks    : See the supplied demo for reference !
  403.  
  404.  =======================================================================
  405.  PROCEDURE Clos_Cfl;
  406.  
  407.  Result     : -
  408.  
  409.  Input      : -
  410.  
  411.  Description: Call this function to close the file you have worked on.
  412.               Even if you have opened the file yourself, use this pro-
  413.               cedure to close it.
  414.  
  415.  Remarks    : OPEN_CFl sets the variables CflPos.
  416.  
  417.  =======================================================================
  418.  FUNCTION  Next_CFl(VAR DTACFl:CIRTyp):BOOLEAN;
  419.  
  420.  Result     : BOOLEAN;
  421.  
  422.  Input      : A variable of the type CIRTyp (carried out with TxCFI).
  423.  
  424.  Description: Next_Cfl returns the next valid entry from the compres-
  425.               sed file and returns TRUE, or returns FALSE if there is
  426.               nothing more to read (E.O.F. on compressed file).
  427.               The returned variables are depending on the type of com-
  428.               pressed file you work on (see comments in the TYPE de-
  429.               claration).
  430.               This function always works after a succesfull Open_CFl,
  431.               Forc_CFl or LFor_CFl. With LFor_CFI you will get the
  432.               first valid entry in the compressed (SFX) file.
  433.  
  434.  Remarks    : When you are working on a DWC-file, after the first
  435.               call you can obtain the number of files in the DWC
  436.               with the variable DWCNuE (never change it);
  437.  
  438.  =======================================================================
  439.  FUNCTION  HEAP_All:BOOLEAN;
  440.  
  441.  Result     : BOOLEAN;
  442.  
  443.  Input      : Nothing
  444.  
  445.  Description: When you are incorporation CFL functions in a part of
  446.               your program that relies on the HEAP, you can do a heap
  447.               allocation before you call TEST_CFL. Test_CFL will then
  448.               use this predefined heap-space and will NOT allocate and
  449.               deallocate HEAP of its own.
  450.               This function should be used when working with sort units
  451.               like Turbo Professional's B-Tree Filer MSort.
  452.  
  453.  Remarks    : Heap_All sets the variable HeapAl. Heap_All will return
  454.               FALSE when no memory is available !
  455.  
  456.  =======================================================================
  457.  FUNCTION  HEAP_Dal:BOOLEAN;
  458.  
  459.  Result     : BOOLEAN;
  460.  
  461.  Input      : Nothing
  462.  
  463.  Description: When you have allocated HEAP with HEAP_All, you can
  464.               deallocate it with Heap_DAl.
  465.  
  466.  Remarks    : Heap_DAl sets the variable HeapAl. Heap_Dal will return
  467.               FALSE when there is no HEAP allocated (HeapAL=FALSE).
  468.  
  469.  Notes on usage
  470.  ───────────────────────────────────────────────────────────────
  471.  TxCFI uses fast I/O (blockread) to access the compressed file. Some
  472.  types of compressed files have and 'strange' structure. The goal of
  473.  the UNIT is to keep memory requirements as low as possible, so an
  474.  extra read is preferred over extra memory. I have used this routine
  475.  in some of my PD-programs like MTV and MTA and I had no complaints
  476.  about the speed !
  477.  
  478.  TxCFI uses extensive tests on probable I/O errors or invalid files.
  479.  The routine snatches Int24 from Turbo Pascal and has no problems
  480.  with unavailable devices, common I/O errors and so on. In case of
  481.  an I/O error, TxCFI returns FALSE from the function-call, so you
  482.  can supply every file with a valid extension but with an invalid
  483.  format. When you make the assumption that every passed file has a
  484.  valid extension (not some exotic variant), you can pass EVERY file
  485.  to OPEN_CFL and depending on the returned condition (FALSE or TRUE)
  486.  take futher action. When an invalid file (e.g. COMMAND.COM or
  487.  TURBO.EXE) is passed to OPEN_CFG, the routine DOES NOT open the file,
  488.  so there is no loss in time (only the function-call).
  489.  You can also use Test_CFL in cases where one expects compressed files
  490.  with alternative extension. Test_CFL does open the file, so consumes
  491.  more time.
  492.  
  493.  TxCFI uses  20K of heap and the small amount of 5000 bytes of stack-
  494.  space. Please adjust your $M values according to this extra consump-
  495.  tion. The heap usage is temporary and only used inside the Test_Cfl
  496.  function.
  497.  
  498.  If you are a Turbo Pascal 4.xx user, you can use the supplied T4CFI
  499.  unit and keep the T5CFI unit for the moment you are going to upgrade
  500.  your current release of Turbo Pascal.
  501.  
  502.  The supplied demo works fine with both releases (4 & 5) of Turbo Pas-
  503.  cal.
  504.  
  505.  Heap Management
  506.  ───────────────────────────────────────────────────────────────
  507.  There are some cases where it is forbidden to allocate HEAP when
  508.  parts of your program is in progress. This is the case when working
  509.  with functions that have their own heap-management. Turbo Profes-
  510.  sional's B-tree Filer MSort unit is such an example. Also it is
  511.  possible that some functions will take all the HEAP and when you
  512.  interface with such function's and you want to call Test_CFL, you
  513.  are left in the cold.
  514.  
  515.  CFI carries two function that can help you with this problem. Nor-
  516.  maly CFI will allocate and deallocate (GETMEM & FREEMEM) HEAP-space
  517.  with every call to Test_CFL. You can force Test_CFl NOT to allocate
  518.  HEAP-space, but in that case this space must be reserved beforehand.
  519.  
  520.  You can obtain this result by calling HEAP_All before you enter the
  521.  HEAP-critical function's. When you call Test_CFL inside this functions,
  522.  no HEAP-space is allocated (this is already done with HEAP_All) and
  523.  the remainder of the HEAP is for the critical function.
  524.  After the critical function ends, you can call HEAP_DAl to release
  525.  the HEAP used by CFI. After the HEAP is deallocated, Test_CFl works
  526.  like it normal does, it allocates and deallocates HEAP every time
  527.  it is called.
  528.  
  529.  How to recognize a valid compression file
  530.  ───────────────────────────────────────────────────────────────
  531.  If you don't want to wast lots of time and don't want to read the
  532.  whole file (a pitty when it isn't a compressed file) there is no
  533.  save way to test if a file is compressed with one of the supported
  534.  methods or not. This is the way how Test_CFL does its work:
  535.  
  536.  - Test the extension for .DWC, if true, its a DWC-file;
  537.  - Read the first 29 bytes of the compressed files;
  538.  - If there is an error (file not found) return a 0 (FALSE);
  539.  - If pos. 1 contains #26 and pos. 2 does not contain #00 and
  540.    there are 29 bytes read, its an ARC compatible compressed
  541.    file and return 1;
  542.  - If pos. 1/2 contains #80#75, its a ZIP compatible compressed
  543.    file and return 2;
  544.  - If pos 21/24 contains #220#167#196#253, its a ZOO compatible
  545.    compressed file and return 3;
  546.  - If pos 3-5 contains -lh and 7 a -, its a LHZ or LZS compressed
  547.    file (NOT a giant Suzuki) and return 4;
  548.  
  549.  These tests are extended a lot when testing for SFX-files.
  550.  
  551.  It is possible that this combination of bytes is available in files
  552.  that are not compressed files. In that case, don't worry, the first
  553.  or next time you call Next_CFL you will get a FALSE situation !
  554.  
  555.  The DWC method is quick and dirty, this is because many I/O has to
  556.  be done to test a DWC and it is not possible for DWC to work on
  557.  files with another extension than .DWC;
  558.  
  559.  SFX files
  560.  ───────────────────────────────────────────────────────────────
  561.  This release supports SFX files (Self extracting Compression
  562.  files). If you have an SFX (ARC (all), PAK, ZIP or LZx) you
  563.  can use LTst_CFl and LFor_Cfl to work out the internal format
  564.  and let CFI display the files inside the SFX with Next_CFl.
  565.  In the supplied demo, you can use the third fase of the program
  566.  to list SFX files like PKZ092.EXE, PAK161.EXE and LH113B.EXE.
  567.  You can make one yourself and try it out.
  568.  
  569.  Future releases
  570.  ───────────────────────────────────────────────────────────────
  571.  - Including file/archive decriptions in ARC files;
  572.  - Yet another compression program ??? Who knows....
  573.  
  574.  Bugs and flaws
  575.  ───────────────────────────────────────────────────────────────
  576.  If you find any bugs, please report them to me or leave a message
  577.  (under the name Rob Van.Hoeven (mind the point)) at FIDO-Emmen !
  578.  
  579.  Releases
  580.  ───────────────────────────────────────────────────────────────
  581.  1.01    : First release
  582.  
  583.  2.01    : - Added Test_CFL and Forc_CFL functions to work easy with
  584.              variable extensions.
  585.  
  586.  3.01    : - Added LZH (LHarc) support. This is done in a cruel and
  587.              dirty way. The original format is, up to this moment,
  588.              not available to me.
  589.            - DWC files are somewhat supported. Depending on the ex-
  590.              tension, CFI detects a DWC file, but is will not look
  591.              to the internal structure;
  592.            - CFITyp is set to 0 after closing the file (could cause
  593.              an error with wrong calling sequences);
  594.            - I/O error checking did not work everywhere. Could cause
  595.              some strange bugs, fixed;
  596.  
  597.  3.02    : - Changed the TEST_CFl test for ZIP-files because it was
  598.              to global to work 99% ok. Some other files start with
  599.              just PK. Now also testing the header !
  600.            - Changed the original and compressed size in a LZH file,
  601.              bug corrected;
  602.  
  603.  4.01    : - DWC internal support;
  604.            - Counters for total compressed and uncompressed sizes;
  605.  
  606.  4.02    : - DWC time/date stamps returned incorrect. Added all the
  607.              coding to compute the right values;
  608.            - DWC timezone changes can be influenced by the user;
  609.  
  610.  4.03    : - TxCFI.TPU made self contained. This means that users with
  611.              Turbo Pascal 5.xx don't need the original Turbo Proffesio-
  612.              nal routines anymore. It was never intended but TP 5.xx
  613.              wants the original included units. TP 4.xx has had no
  614.              problems of this kind.
  615.  
  616.  4.04    : - Not a public release (tests for LZS);
  617.  
  618.  4.05    : - Implemented LZS;
  619.  
  620.  5.01    : - Implemented SFX support for ARC (all), PAK, ZIP, LZH
  621.              and LZS.
  622.  
  623.  5.02    : - Fixed a bug in SFX support. Not almost 99.99% was
  624.              tested ok.
  625.  
  626.  5.03    : - Implemented 'external HEAP-support';
  627.  
  628.  5.04    : Not released, internal usage only;
  629.  
  630.  5.05    : - Implemented a combined test for SFX and NO-SFX.
  631.            - Dropped the LFor_CFl and LTst_CFl functions, they
  632.              are now included in Forc_Cfl and Test_CFl.
  633.            - Added Heap_All and Heap_Dal functions to make exter-
  634.              nal HEAP-support really external;
  635.  
  636.  6.01    : - Added code to implement PKZIP release 1.0 imploding
  637.              method. Taken from the BETA-release documentation.
  638.              No actual PKZIP/PKUNZIP program is available, so this
  639.              is implemented from paper;
  640.            - Optimized the TEST_CFL function. If extension is COM
  641.              or EXE a full (20000 bytes) SFX-test will be done,
  642.              if other extension, then a small (1000 bytes) test is
  643.              done to see if file contains a false (shifted) header.
  644.              Files under 200 bytes are not tested for shifted
  645.              headers or SFX-headers.
  646.  
  647.  6.02    : - Changed code to support both LHarc/LZH and LHice/ICE
  648.              files when testing on extension. This is changed in
  649.              LHarc release 1.14. LHarc V 1.14 is a doubtfull release;
  650.  
  651.  6.05    : - Added support for type 11 (Nogate's Destilled), thus
  652.              supporting PAK V 2.0;
  653.            - Fixed bug in PKZ 1.00 (imploding) support. Central
  654.              directory entries 87,88 and 89 could occur. This was
  655.              a trial version, only 86 + general flags are supported.
  656.  
  657.  6.06    : - Fixed a bug where CFI could hang while testing for
  658.              an SFX-file. Fixed.
  659.  
  660. |6.07    : - Fixed a bug in Turbo Pascal 5.5 implementation
  661.  
  662.  Notice
  663.  ───────────────────────────────────────────────────────────────
  664.  Some ideas for this unit came from Philip R. Burns package
  665.  PIBCAT17 (ZOO/DWC-files). The formats for ZIP, ARC and PAK came
  666.  from the documents supplied with those programs. The format for
  667.  LZH/ICE is worked out in a trial on error method.
  668.  
  669.  - ARC         is a trademark of SEA;
  670.  - PAK         is a trademark of NoGate Consulting;
  671.  - ZIP         is a free extension with thanks to PkWare and Phil;
  672.  - ZOO         is a trademark of Rahul Dhesi;
  673.  - DWC         is a trademark of Dean W. Cooper;
  674.  - LZH/ICE     is a trademark of Haruyasu Yoshizaki
  675.   -LZS         is a trademark of M.Miki's, H.Okumura and K.Masuyama
  676.  
  677. |This UNIT is written and compiled with Borland's Turbo Pascal 5.5 and
  678.  uses some routines from Turbo Professional 5.01. Everything was tested
  679.  with the Turbo Debugger 1.0. The T4CFI.TPU unit is compiled under
  680.  Turbo Pascal 4.0. The Turbo Professional routines are self-contained
  681.  (you don't need the original units when compiling under TPascal 5.0)
  682.  and NOT interfaced outside;
  683.  
  684.  Turbo Pascal       is a trademark of Borland International
  685.  Turbo Debugger     is a trademark of Borland International
  686.  Turbo Professional is a trademark of TurboPower Inc.
  687.  B-Tree Filer       is a trademark of TorboPower Inc.
  688.  
  689.  Sorry for my usage of the English language, it's not my native language
  690.  so this can happen.
  691.  
  692.  If you have suggestions, additions or other comments, you can leave a
  693.  message, addressed to me (Rob Van.hoeven) at FIDO Emmen.
  694.  
  695.  Support and Registration
  696.  ───────────────────────────────────────────────────────────────
  697.  As mentioned earlier, when you use the UNIT(s), please send me a
  698.  postcard or a NetMail message.
  699.  
  700.  When you have troubles, find bugs or have otherwise comments on this
  701.  package, please let me know.
  702.  
  703.  
  704.  You can send a postcard to the address in the header of this documen-
  705.  tation, or you can send a netmail <tm> message to:
  706.  
  707.  Rob Van.Hoeven (watch the point !)
  708.  
  709.  National     : FIDO Emmen Holland                  -- 2:500/31
  710.  International: QuickBBS International Support Node -- 2:2/100
  711.